#ifndef _HASHTABLE_H
#define _HASHTABLE_H
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
// 哈希表需要初始化？ 王浩宇的fab哈希函数
typedef struct entry {
    void *key;           // 键
    void *value;         // 值
    struct entry *next;  // 冲突链表
} *Entry;

#define newEntry() acemesh_myalloc_aligned_16(sizeof(struct entry))//libc_uncached_aligned_malloc(sizeof(struct entry))
#define newEntryList(length) acemesh_myalloc_aligned_16(length*sizeof(struct entry))//libc_uncached_aligned_malloc(length * sizeof(struct entry))

// 哈希结构
typedef struct hashMap *HashMap;
#define newHashMap() acemesh_myalloc_aligned_16(sizeof(struct hashMap))//libc_uncached_aligned_malloc(sizeof(struct hashMap))
/*
// 哈希函数类型
typedef int (*HashCode)(HashMap hashMap, void *key);

// 判等函数类型
typedef bool (*Equal)(void *key1, void *key2);

// 添加键函数类型
typedef void (*Put)(HashMap hashMap, void *key, void *value);

// 获取键对应值的函数类型
typedef void *(*Get)(HashMap hashMap, void *key);

// 删除键的函数类型
typedef bool (*Remove)(HashMap hashMap, void *key);

// 清空Map的函数类型
typedef void (*Clear)(HashMap hashMap);

// 判断键值是否存在的函数类型
typedef bool (*Exists)(HashMap hashMap, void *key);  // 修改为存在就返回value，不存在返回NULL
*/
typedef struct hashMap {
    int size;      // 当前大小
    int listSize;  // 有效空间大小
    // HashCode hashCode;  // 哈希函数
    // Equal equal;        // 判等函数
    Entry list;  // 存储区域
    // Put put;            // 添加键的函数
    // Get get;            // 获取键对应值的函数
    // Remove remove;      // 删除键
    // Clear clear;        // 清空Map
    // Exists exists;      // 判断键是否存在
    // bool autoAssign;    // 设定是否根据当前数据量动态调整内存大小，默认开启
} *HashMap;

// 默认哈希函数
int hashCode(HashMap hashMap, void *key);
int slave_hashCode(HashMap hashMap, void *key);
// 默认判断键值是否相等
bool hashEqual(void *key1, void *key2);
bool slave_hashEqual(void *key1, void *key2);
// 默认添加键值对
void hashPut(HashMap hashMap, void *key, void *value);
void slave_hashPut(HashMap hashMap, void *key, void *value);
// 默认获取键对应值
void *hashGet(HashMap hashMap, void *key);
void *slave_hashGet(HashMap hashMap, void *key);
// 默认删除键
bool hashRemove(HashMap hashMap, void *key);
bool slave_hashRemove(HashMap hashMap, void *key);
// 默认判断键是否存在
bool hashExists(HashMap hashMap, void *key);
bool slave_hashExists(HashMap hashMap, void *key);
// 默认清空Map
void hashClear(HashMap hashMap);
void slave_hashClear(HashMap hashMap);
// 创建一个哈希结构
HashMap createHashMap();
HashMap slave_createHashMap();
// 重新构建
void resetHashMap(HashMap hashMap, int listSize);
void slave_resetHashMap(HashMap hashMap, int listSize);
// 迭代器结构
typedef struct hashMapIterator {
    Entry entry;   // 迭代器当前指向
    int count;     // 迭代次数
    int hashCode;  // 键值对的哈希值
    HashMap hashMap;
} *HashMapIterator;

#define newHashMapIterator() acemesh_myalloc_aligned_16(sizeof(struct hashMapIterator))//libc_uncached_aligned_malloc(sizeof(struct hashMapIterator))
//#define slave_newHashMapIterator() slave_acemesh_myalloc_aligned_16(sizeof(struct hashMapIterator),_MYID)
// 创建哈希结构迭代器
HashMapIterator createHashMapIterator(HashMap hashMap);

// 迭代器是否有下一个
bool hasNextHashMapIterator(HashMapIterator iterator);

// 迭代到下一次
HashMapIterator nextHashMapIterator(HashMapIterator iterator);

// 释放迭代器内存
void freeHashMapIterator(HashMapIterator *iterator);

HashMapIterator slave_createHashMapIterator(HashMap hashMap);

// 迭代器是否有下一个
bool slave_hasNextHashMapIterator(HashMapIterator iterator);

// 迭代到下一次
HashMapIterator slave_nextHashMapIterator(HashMapIterator iterator);

// 释放迭代器内存
void slave_freeHashMapIterator(HashMapIterator *iterator);

#ifdef __cplusplus
}
#endif
#endif
